package com.geek.javase.ch18.work.work4;

import org.junit.Test;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;

/*
 *@Date 2025/11/7
 *@Author wangpeng
 *@Description
 *  *定义一个注解：Book
 *  *     包含属性：String value()        书名
 *  *     包含属性：double price() 价格，默认值为 100
 *  *     包含属性：String[] authors() 多位作者
 *  *
 *  * 1.定义类在成员方法上使用Book注解
 *  * 2.解析获得该成员方法上使用注解的属性值。
 */
public class TestAnnotation {
    //解析BookStore类上的@Book注解信息
    @Test
    public void testAnnotationType() {
        //1.获取BookStore的类类型
        Class<BookStore> clazz = BookStore.class;
        //2.获取BookStore类上的指定注解
        Book  bookAnnotation = clazz.getAnnotation(Book.class);
        //3.获取Book注解上的属性信息
        System.out.println(bookAnnotation.value());
        System.out.println(bookAnnotation.price());
        //System.out.println(bookAnnotation.authors());
        System.out.println(Arrays.toString(bookAnnotation.authors()));
    }
    //解析BookStore类，方法上的@Book注解信息
    @Test
    public void testAnnotationMethod() throws NoSuchMethodException {
        //1.获取BookStore的类类型
        Class<BookStore> clazz = BookStore.class;
        //2.获取BookStore类中方法对象
        Method buyMethod = clazz.getDeclaredMethod("buy");
        //3.判断当前方法上，是否有Book注解
        if (buyMethod.isAnnotationPresent(Book.class)) {
            //4.若有Book注解，则获取方法上注解
            Book bookAnnotation = buyMethod.getAnnotation(Book.class);
            //5.获取方法上注解的属性信息
            System.out.println(bookAnnotation.value());
            System.out.println(bookAnnotation.price());
            System.out.println(Arrays.toString(bookAnnotation.authors()));
        }else{
            System.out.println("当前buy()方法没有使用Book注解");
        }
    }
    //解析BookStore类，属性上的@Book注解信息
    @Test
    public void testAnnotationField() throws NoSuchFieldException {
        //1.获取BookStore的类类型
        Class<BookStore> clazz = BookStore.class;
        //2.获取BookStore类中属性对象
        Field nameField = clazz.getDeclaredField("bookName");
        ////3.判断当前属性上，是否有Book注解
        if (nameField.isAnnotationPresent(Book.class)) {
            //4.若有Book注解，则获取属性上注解
            Book bookAnnotation = nameField.getAnnotation(Book.class);
            //5.获取属性上注解的属性信息
            System.out.println(bookAnnotation.value());
            System.out.println(bookAnnotation.price());
            System.out.println(Arrays.toString(bookAnnotation.authors()));
        }else {
            System.out.println("当前bookName属性没有使用Book注解");
        }
    }
}
